package ai.zixing.mashibing.basic_class.class01;

public class Code07_EvenTimesOddTimes {

    public static void main(String[] args) {
        int a = 6;
        int b = 8;

        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println(a);
        System.out.println(b);
    }

    // arr 中只有一个数出现了奇数次，找到这个数
    public static void printOdTimesNum1(int[] arr) {
        int eor = 0;
        for (int i : arr) {
            eor ^= i;
        }
        System.out.println(eor);
    }

    // arr 中有两个数出现了奇数次，找到这两个数
    public static void printOdTimesNum2(int[] arr) {
        int eor = 0;
        for (int i = 0; i < arr.length; i++) {
            eor ^= arr[i];
        }
        // 以上找到了这两个数的异或结果
        // 找到 eor 最后的一个1的位置
        int rightOne = eor & (~eor + 1);
        int secondEor = 0;
        // 将最后一位是 1 的将集合分为两类，将两个数分到了者两类中了
        for (int i = 0; i < arr.length; i++) {
            // 取其中的一类
            if ((rightOne & arr[i]) != 0) {
                secondEor ^= arr[i];
            }
        }
        System.out.println(secondEor + "   " + (secondEor ^ eor));
    }

    // 提取 num 对应二进制中 1 的个数
    public static int bit1Counts(int num) {
        int count = 0;
        while (num != 0) {
            int rightOne = num & (~num + 1);
            count++;
            // 将最后一个 1 删除，继续执行
            num ^= rightOne;
        }
        return count;
    }
}
